{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### This jupyter notebooks provides the code for classifying signals using the Continuous Wavelet Transform and Convolutional Neural Networks.\n",
    "### To get some more background information, please have a look at the accompanying blog-post:\n",
    "### http://ataspinar.com/2018/12/21/a-guide-for-using-the-wavelet-transform-in-machine-learning/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import pywt\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from collections import defaultdict, Counter\n",
    "import keras\n",
    "from keras.layers import Dense, Flatten\n",
    "from keras.layers import Conv2D, MaxPooling2D\n",
    "from keras.models import Sequential\n",
    "from keras.callbacks import History \n",
    "history = History()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. Loading the UCI HAR dataset into an numpy ndarray\n",
    "Download dataset from https://archive.ics.uci.edu/ml/datasets/Human+Activity+Recognition+Using+Smartphones"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The train dataset contains 7352 signals, each one of length 128 and 9 components \n",
      "The test dataset contains 2947 signals, each one of length 128 and 9 components \n",
      "The train dataset contains 7352 labels, with the following distribution:\n",
      " Counter({5: 1407, 4: 1374, 3: 1286, 0: 1226, 1: 1073, 2: 986})\n",
      "The test dataset contains 2947 labels, with the following distribution:\n",
      " Counter({5: 537, 4: 532, 0: 496, 3: 491, 1: 471, 2: 420})\n"
     ]
    }
   ],
   "source": [
    "activities_description = {\n",
    "    1: 'walking',\n",
    "    2: 'walking upstairs',\n",
    "    3: 'walking downstairs',\n",
    "    4: 'sitting',\n",
    "    5: 'standing',\n",
    "    6: 'laying'\n",
    "}\n",
    "\n",
    "def read_signals(filename):\n",
    "    with open(filename, 'r') as fp:\n",
    "        data = fp.read().splitlines()\n",
    "        data = map(lambda x: x.rstrip().lstrip().split(), data)\n",
    "        data = [list(map(float, line)) for line in data]\n",
    "    return data\n",
    "\n",
    "def read_labels(filename):        \n",
    "    with open(filename, 'r') as fp:\n",
    "        activities = fp.read().splitlines()\n",
    "        activities = list(map(lambda x: int(x)-1, activities))\n",
    "    return activities\n",
    "\n",
    "def randomize(dataset, labels):\n",
    "    permutation = np.random.permutation(labels.shape[0])\n",
    "    shuffled_dataset = dataset[permutation, :, :]\n",
    "    shuffled_labels = labels[permutation]\n",
    "    return shuffled_dataset, shuffled_labels\n",
    "\n",
    "INPUT_FOLDER_TRAIN = './data/train/InertialSignals/'\n",
    "INPUT_FOLDER_TEST = './data/test/InertialSignals/'\n",
    "\n",
    "INPUT_FILES_TRAIN = ['body_acc_x_train.txt', 'body_acc_y_train.txt', 'body_acc_z_train.txt', \n",
    "                     'body_gyro_x_train.txt', 'body_gyro_y_train.txt', 'body_gyro_z_train.txt',\n",
    "                     'total_acc_x_train.txt', 'total_acc_y_train.txt', 'total_acc_z_train.txt']\n",
    "\n",
    "INPUT_FILES_TEST = ['body_acc_x_test.txt', 'body_acc_y_test.txt', 'body_acc_z_test.txt', \n",
    "                     'body_gyro_x_test.txt', 'body_gyro_y_test.txt', 'body_gyro_z_test.txt',\n",
    "                     'total_acc_x_test.txt', 'total_acc_y_test.txt', 'total_acc_z_test.txt']\n",
    "\n",
    "LABELFILE_TRAIN = './data/train/y_train.txt'\n",
    "LABELFILE_TEST = './data/test/y_test.txt'\n",
    "\n",
    "train_signals, test_signals = [], []\n",
    "\n",
    "for input_file in INPUT_FILES_TRAIN:\n",
    "    signal = read_signals(INPUT_FOLDER_TRAIN + input_file)\n",
    "    train_signals.append(signal)\n",
    "train_signals = np.transpose(np.array(train_signals), (1, 2, 0))\n",
    "\n",
    "for input_file in INPUT_FILES_TEST:\n",
    "    signal = read_signals(INPUT_FOLDER_TEST + input_file)\n",
    "    test_signals.append(signal)\n",
    "test_signals = np.transpose(np.array(test_signals), (1, 2, 0))\n",
    "\n",
    "train_labels = read_labels(LABELFILE_TRAIN)\n",
    "test_labels = read_labels(LABELFILE_TEST)\n",
    "\n",
    "[no_signals_train, no_steps_train, no_components_train] = np.shape(train_signals)\n",
    "[no_signals_test, no_steps_test, no_components_test] = np.shape(test_signals)\n",
    "no_labels = len(np.unique(train_labels[:]))\n",
    "\n",
    "print(\"The train dataset contains {} signals, each one of length {} and {} components \".format(no_signals_train, no_steps_train, no_components_train))\n",
    "print(\"The test dataset contains {} signals, each one of length {} and {} components \".format(no_signals_test, no_steps_test, no_components_test))\n",
    "print(\"The train dataset contains {} labels, with the following distribution:\\n {}\".format(np.shape(train_labels)[0], Counter(train_labels[:])))\n",
    "print(\"The test dataset contains {} labels, with the following distribution:\\n {}\".format(np.shape(test_labels)[0], Counter(test_labels[:])))\n",
    "\n",
    "uci_har_signals_train, uci_har_labels_train = randomize(train_signals, np.array(train_labels))\n",
    "uci_har_signals_test, uci_har_labels_test = randomize(test_signals, np.array(test_labels))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. Applying a CWT to UCI HAR signals and saving the resulting scaleogram into an numpy ndarray"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "1000\n",
      "2000\n",
      "3000\n",
      "4000\n",
      "0\n",
      "100\n",
      "200\n",
      "300\n",
      "400\n"
     ]
    }
   ],
   "source": [
    "scales = range(1,128)\n",
    "waveletname = 'morl'\n",
    "train_size = 5000\n",
    "train_data_cwt = np.ndarray(shape=(train_size, 127, 127, 9))\n",
    "\n",
    "for ii in range(0,train_size):\n",
    "    if ii % 1000 == 0:\n",
    "        print(ii)\n",
    "    for jj in range(0,9):\n",
    "        signal = uci_har_signals_train[ii, :, jj]\n",
    "        coeff, freq = pywt.cwt(signal, scales, waveletname, 1)\n",
    "        coeff_ = coeff[:,:127]\n",
    "        train_data_cwt[ii, :, :, jj] = coeff_\n",
    "\n",
    "test_size = 500\n",
    "test_data_cwt = np.ndarray(shape=(test_size, 127, 127, 9))\n",
    "for ii in range(0,test_size):\n",
    "    if ii % 100 == 0:\n",
    "        print(ii)\n",
    "    for jj in range(0,9):\n",
    "        signal = uci_har_signals_test[ii, :, jj]\n",
    "        coeff, freq = pywt.cwt(signal, scales, waveletname, 1)\n",
    "        coeff_ = coeff[:,:127]\n",
    "        test_data_cwt[ii, :, :, jj] = coeff_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. Training a Convolutional Neural Network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x_train shape: (5000, 127, 127, 9)\n",
      "5000 train samples\n",
      "500 test samples\n"
     ]
    }
   ],
   "source": [
    "x_train = train_data_cwt\n",
    "y_train = list(uci_har_labels_train[:train_size])\n",
    "x_test = test_data_cwt\n",
    "y_test = list(uci_har_labels_test[:test_size])\n",
    "img_x = 127\n",
    "img_y = 127\n",
    "img_z = 9\n",
    "num_classes = 6\n",
    "\n",
    "batch_size = 16\n",
    "epochs = 10\n",
    "\n",
    "# reshape the data into a 4D tensor - (sample_number, x_img_size, y_img_size, num_channels)\n",
    "# because the MNIST is greyscale, we only have a single channel - RGB colour images would have 3\n",
    "input_shape = (img_x, img_y, img_z)\n",
    "\n",
    "# convert the data to the right type\n",
    "#x_train = x_train.reshape(x_train.shape[0], img_x, img_y, img_z)\n",
    "#x_test = x_test.reshape(x_test.shape[0], img_x, img_y, img_z)\n",
    "x_train = x_train.astype('float32')\n",
    "x_test = x_test.astype('float32')\n",
    "\n",
    "print('x_train shape:', x_train.shape)\n",
    "print(x_train.shape[0], 'train samples')\n",
    "print(x_test.shape[0], 'test samples')\n",
    "\n",
    "# convert class vectors to binary class matrices - this is for use in the\n",
    "# categorical_crossentropy loss below\n",
    "y_train = keras.utils.to_categorical(y_train, num_classes)\n",
    "y_test = keras.utils.to_categorical(y_test, num_classes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /home/onetime/yes/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.cast instead.\n",
      "Train on 5000 samples, validate on 500 samples\n",
      "Epoch 1/10\n",
      "5000/5000 [==============================] - 235s 47ms/step - loss: 0.3963 - acc: 0.8876 - val_loss: 0.6006 - val_acc: 0.8780\n",
      "Epoch 2/10\n",
      "5000/5000 [==============================] - 228s 46ms/step - loss: 0.1939 - acc: 0.9282 - val_loss: 0.3952 - val_acc: 0.8880\n",
      "Epoch 3/10\n",
      "5000/5000 [==============================] - 224s 45ms/step - loss: 0.1347 - acc: 0.9434 - val_loss: 0.4367 - val_acc: 0.9100\n",
      "Epoch 4/10\n",
      "5000/5000 [==============================] - 228s 46ms/step - loss: 0.1971 - acc: 0.9334 - val_loss: 0.2662 - val_acc: 0.9320\n",
      "Epoch 5/10\n",
      "5000/5000 [==============================] - 231s 46ms/step - loss: 0.1134 - acc: 0.9544 - val_loss: 0.2131 - val_acc: 0.9320\n",
      "Epoch 6/10\n",
      "5000/5000 [==============================] - 230s 46ms/step - loss: 0.1285 - acc: 0.9520 - val_loss: 0.2014 - val_acc: 0.9440\n",
      "Epoch 7/10\n",
      "5000/5000 [==============================] - 232s 46ms/step - loss: 0.1339 - acc: 0.9532 - val_loss: 0.2884 - val_acc: 0.9300\n",
      "Epoch 8/10\n",
      "5000/5000 [==============================] - 237s 47ms/step - loss: 0.1503 - acc: 0.9488 - val_loss: 0.3181 - val_acc: 0.9340\n",
      "Epoch 9/10\n",
      "5000/5000 [==============================] - 250s 50ms/step - loss: 0.1247 - acc: 0.9504 - val_loss: 0.2403 - val_acc: 0.9460\n",
      "Epoch 10/10\n",
      "5000/5000 [==============================] - 238s 48ms/step - loss: 0.1578 - acc: 0.9508 - val_loss: 0.2133 - val_acc: 0.9300\n",
      "Train loss: 0.11115437872409821, Train accuracy: 0.959\n",
      "Test loss: 0.21326758581399918, Test accuracy: 0.93\n"
     ]
    }
   ],
   "source": [
    "model = Sequential()\n",
    "model.add(Conv2D(32, kernel_size=(5, 5), strides=(1, 1), activation='relu', input_shape=input_shape)) \n",
    "model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))\n",
    "model.add(Conv2D(64, (5, 5), activation='relu'))\n",
    "model.add(MaxPooling2D(pool_size=(2, 2)))\n",
    "model.add(Flatten())\n",
    "model.add(Dense(1000, activation='relu'))\n",
    "model.add(Dense(num_classes, activation='softmax'))\n",
    "\n",
    "model.compile(loss=keras.losses.categorical_crossentropy, \n",
    "              optimizer=keras.optimizers.Adam(), \n",
    "              metrics=['accuracy'])\n",
    "\n",
    "model.fit(x_train, y_train, batch_size=batch_size, \n",
    "          epochs=epochs, verbose=1, \n",
    "          validation_data=(x_test, y_test), \n",
    "          callbacks=[history])\n",
    "\n",
    "train_score = model.evaluate(x_train, y_train, verbose=0)\n",
    "print('Train loss: {}, Train accuracy: {}'.format(train_score[0], train_score[1]))\n",
    "test_score = model.evaluate(x_test, y_test, verbose=0)\n",
    "print('Test loss: {}, Test accuracy: {}'.format(test_score[0], test_score[1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nXO/9Lyptt0A0EAlEARHAzoBXLCIS4oIZuNsAWyo9zvE+V9n/AyYbY3KAD4Ff101pIiKNVk3a5u+B\ni7z3JwAJxphka+0CnAC+3fvzibV2dYDrFREJecEM3Mca12erPL4cmGGtTQPOBWYaY46q2RhzozFm\nqTFmaW5ubgBKFRFpNGrSNt8GjDHGLMcZMrIVqDDGdAZ6AGk4If00Y8zoo06gNltEGplgBu4coG2l\nx2kcPWTkOuBNAG/PSTTQvOqBrLXPWmszrLUZKSkpASpXRKRROGHbbK3dZq2d6L2+5i7vc/twersX\nWmsLrbWFwEfAsKonUJstIo1NMAP3EqCLMSbdGBOJc1Hk7Cr7bAZOBzDG9MAJ3OoOEREJnBO2zcaY\n5pW+bbwTeMF7fzNOz3e4MSYCp/dbQ0pEpNELWuC21lYAtwCf4DTIb1prfzTG3G+MucC72/8BNxhj\nvgdeA6ZYa6t+tSkiIn5Sw7Z5LLDWGLMOaAE86H3+bSALWIkzzvt7a+17dVm/iEgoMg0tv2ZkZNil\nS5cGuwwREZ8ZY5ZZazOCXUddUpstIvVZTdttrTQpIiIiIhJACtwiIiIiIgGkwC0iIiIiEkAK3CIi\nIiIiAaTALSIiIiISQArcIiIiIiIBpMAtIiIiIhJACtwiIiIiIgGkwC0iIiIiEkAK3CIiIiIiAaTA\nLSIiIiISQArcIiIiIiIBpMAtIiIiIhJACtwiIiIiIgGkwC0iIiIiEkAK3CIiIiIiAaTALSIiIiIS\nQArcIiIiIiIBpMAtIiIiIhJACtwiIiIiIgGkwC0iIiIiEkAK3CIiIiIiAaTALSIiIiISQArcIiIi\nIiIBpMAtIiIiIhJACtwiIiIiIgGkwC0iIiIiEkAK3CIiIiIiAaTALSIiIiISQArcIiIiIiIBpMAt\nIiIiIhJACtwiIiIiIgGkwC0iIiIiEkAK3CIiIiIiAaTALSIiIiISQArcIiIiIiIBpMAtIiIiIhJA\nCtwiIiIiIgGkwC0iIiIiEkAK3CIiIiIiAaTALSIiIiISQArcIiIiIiIBpMAtIiIiIhJACtwiIiIi\nIgGkwC0iIiIiEkAK3CIiIiIiAaTALSIiIiISQArcIiIiIiIBpMAtIiIiIhJACtwiIiIiIgGkwC0i\nIiIiEkAK3CIiIiIiAaTALSIiIiISQArcIiIiIiIBpMAtIiIiIhJANQ7cxph1xpg/GmNaBrIgERGp\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f97b8c059b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axarr = plt.subplots(figsize=(12,6), ncols=2)\n",
    "axarr[0].plot(range(1, 11), history.history['acc'], label='train score')\n",
    "axarr[0].plot(range(1, 11), history.history['val_acc'], label='test score')\n",
    "axarr[0].set_xlabel('Number of Epochs', fontsize=18)\n",
    "axarr[0].set_ylabel('Accuracy', fontsize=18)\n",
    "axarr[0].set_ylim([0,1])\n",
    "axarr[1].plot(range(1, 11), history.history['acc'], label='train score')\n",
    "axarr[1].plot(range(1, 11), history.history['val_acc'], label='test score')\n",
    "axarr[1].set_xlabel('Number of Epochs', fontsize=18)\n",
    "axarr[1].set_ylabel('Accuracy', fontsize=18)\n",
    "axarr[1].set_ylim([0.9,1])\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
